/*
 * Individuo.h
 *
 *  Created on: 18/10/2012
 *      Author: vagner
 */

#ifndef INDIVIDUO_H_
#define INDIVIDUO_H_
#include <vector>
#include "MyMatrix.h"
#include "Grafo.h"
#include "VerticesCandidatos.h"

namespace computacaoNatural {
typedef std::vector<int> Genotipo;
typedef MyMatrix MatrizDemanda;


class Individuo {
private:
	int ID;
	int tamGenotipo;
	Genotipo pGenotipo; //Conjunto de soluões p-Medianas
	MatrizDemanda* pMatrizDemanda;
	double fitness;

public:
	Individuo(int iD, int numMedianas, int numVertices);
	Individuo();
	double getFitness();
	void calculaFitness(Grafo* G);
	//Sorteia p inteiros distintos variando de 0 a n-1;
	inline void sorteia(const int& p, const int& n, std::vector<int>& genotipo);
	inline bool findInVector(const std::vector<int>& Lista, int item) const;
	//Define atendimento para vertice de uma determinada mediana;
	void setAtendimento(int mediana, int vertice);
	void selecioneVerticesCandidatos(int mediana, std::vector<candidato>* pCandidatos, Grafo* G);
	void alteraAlelo(int alelo, int novoValor);
	bool findAlelo (const int& alelo) const;
	int getAlelo(const int& posicao) const;
	std::vector<int>* diferenca( const Individuo& i) const;
	bool operator == (const Individuo& i);
	int getTamGenotipo();
	void show() const;
	virtual ~Individuo();
};

} /* namespace computacaoNatural */
#endif /* INDIVIDUO_H_ */
